package com.zjcloud.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * SQL日志工具类，用于记录数据库操作
 *
 * @author zjcloud
 */
public class SqlLogUtil {

    private static final Logger log = LoggerFactory.getLogger(SqlLogUtil.class);

    /**
     * 记录查询开始日志
     *
     * @param mapperName Mapper名称
     * @param methodName 方法名称
     * @param params 查询参数
     */
    public static void logQueryStart(String mapperName, String methodName, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append("开始执行查询: ").append(mapperName).append(".").append(methodName);
        
        if (params != null && params.length > 0) {
            sb.append(" 参数: ");
            for (int i = 0; i < params.length; i++) {
                if (i > 0) {
                    sb.append(", ");
                }
                sb.append(formatParam(params[i]));
            }
        }
        
        log.debug(sb.toString());
    }

    /**
     * 记录查询结束日志
     *
     * @param mapperName Mapper名称
     * @param methodName 方法名称
     * @param result 查询结果
     * @param startTime 开始时间
     */
    public static void logQueryEnd(String mapperName, String methodName, Object result, long startTime) {
        long endTime = System.currentTimeMillis();
        long costTime = endTime - startTime;
        
        StringBuilder sb = new StringBuilder();
        sb.append("结束执行查询: ").append(mapperName).append(".").append(methodName);
        sb.append(" 耗时: ").append(costTime).append("ms");
        
        if (result != null) {
            sb.append(" 结果: ").append(formatResult(result));
        } else {
            sb.append(" 结果: null");
        }
        
        log.debug(sb.toString());
    }

    /**
     * 记录更新开始日志
     *
     * @param mapperName Mapper名称
     * @param methodName 方法名称
     * @param params 更新参数
     */
    public static void logUpdateStart(String mapperName, String methodName, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append("开始执行更新: ").append(mapperName).append(".").append(methodName);
        
        if (params != null && params.length > 0) {
            sb.append(" 参数: ");
            for (int i = 0; i < params.length; i++) {
                if (i > 0) {
                    sb.append(", ");
                }
                sb.append(formatParam(params[i]));
            }
        }
        
        log.debug(sb.toString());
    }

    /**
     * 记录更新结束日志
     *
     * @param mapperName Mapper名称
     * @param methodName 方法名称
     * @param affectedRows 影响行数
     * @param startTime 开始时间
     */
    public static void logUpdateEnd(String mapperName, String methodName, int affectedRows, long startTime) {
        long endTime = System.currentTimeMillis();
        long costTime = endTime - startTime;
        
        StringBuilder sb = new StringBuilder();
        sb.append("结束执行更新: ").append(mapperName).append(".").append(methodName);
        sb.append(" 耗时: ").append(costTime).append("ms");
        sb.append(" 影响行数: ").append(affectedRows);
        
        log.debug(sb.toString());
    }

    /**
     * 格式化参数
     *
     * @param param 参数
     * @return 格式化后的参数字符串
     */
    private static String formatParam(Object param) {
        if (param == null) {
            return "null";
        }
        
        // 对于复杂对象，只返回类名和hashCode，避免输出过多信息
        if (param instanceof String || param instanceof Number || param instanceof Boolean) {
            return param.toString();
        } else {
            return param.getClass().getSimpleName() + "@" + Integer.toHexString(param.hashCode());
        }
    }

    /**
     * 格式化结果
     *
     * @param result 结果
     * @return 格式化后的结果字符串
     */
    private static String formatResult(Object result) {
        if (result == null) {
            return "null";
        }
        
        // 对于集合类型，返回大小信息
        if (result instanceof java.util.Collection) {
            return "Collection(size=" + ((java.util.Collection<?>) result).size() + ")";
        } else if (result instanceof java.util.Map) {
            return "Map(size=" + ((java.util.Map<?, ?>) result).size() + ")";
        } else if (result.getClass().isArray()) {
            return "Array(length=" + java.lang.reflect.Array.getLength(result) + ")";
        } else if (result instanceof Number || result instanceof Boolean || result instanceof String) {
            return result.toString();
        } else {
            return result.getClass().getSimpleName() + "@" + Integer.toHexString(result.hashCode());
        }
    }
}